package io.gitee.devaper.starlight.common.entity.vo


/**
 * 接口响应数据结构
 *
 * @param code 状态码 (目前图省事, 只分为了 success、unauthenticated、warning、error 几个)
 * @param msg 消息
 * @param data 实际数据
 */
data class ApiResult<T>(
    val code: Int,
    val msg: String? = null,
    val data: T? = null
) {

    companion object {

        /**
         * 创建一个无数据体的成功响应
         */
        fun success(): ApiResult<*> {
            return ApiResult<Nothing>(code = 200)
        }

        /**
         * 创建一个带有数据体的成功响应
         *
         * @param data 数据体
         */
        fun <T> success(data: T): ApiResult<T> {
            return ApiResult(code = 200, data = data)
        }

        /**
         * 创建一个带有消息内容的警告提示响应
         *
         * @param msg 提示信息内容
         */
        fun warn(msg: String): ApiResult<*> {
            return ApiResult<Nothing>(code = -1, msg = msg)
        }

        /**
         * 创建一个带有消息内容的错误提示响应
         *
         * @param msg 提示信息内容
         */
        fun error(msg: String): ApiResult<*> {
            return ApiResult<Nothing>(code = 1, msg = msg)
        }

        /**
         * 创建一个带有消息内容的未认证响应
         *
         * 前端收到该响应后会直接重定向到登录页
         *
         * @param msg 提示消息内容, 不传递使用前端默认
         */
        fun unauthenticated(msg: String? = null): ApiResult<*> {
            return ApiResult<Nothing>(code = 0, msg = msg)
        }
    }

}
